Registered S3 method overwritten by 'quantmod':
method from
as.zoo.data.frame zoo
── Attaching core tidyquant packages ─────────────────────── tidyquant 1.0.11 ──
✔ PerformanceAnalytics 2.0.8 ✔ TTR 0.24.4
✔ quantmod 0.4.28 ✔ xts 0.14.1── Conflicts ────────────────────────────────────────── tidyquant_conflicts() ──
✖ zoo::as.Date() masks base::as.Date()
✖ zoo::as.Date.numeric() masks base::as.Date.numeric()
✖ dplyr::filter() masks stats::filter()
✖ xts::first() masks dplyr::first()
✖ zoo::index() masks tsibble::index()
✖ tsibble::interval() masks lubridate::interval()
✖ dplyr::lag() masks stats::lag()
✖ xts::last() masks dplyr::last()
✖ PerformanceAnalytics::legend() masks graphics::legend()
✖ quantmod::summary() masks base::summary()
✖ tidyquant::VAR() masks fable::VAR()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
Attaching package: 'tidyquant'
The following object is masked from 'package:fable':
VAR
library(plotly)
Attaching package: 'plotly'
The following object is masked from 'package:ggplot2':
last_plot
The following object is masked from 'package:stats':
filter
The following object is masked from 'package:graphics':
layout
En la siguiente sección, se definiran los potenciales modelos para la serie. Se considera que al notar diversos outliers y varianza creciente se utilizará el trend y season multiplicativo.
# Comparar con el test usando MAEfc |>accuracy(exp_test) |>arrange(MAE)
# A tibble: 8 × 10
.model .type ME RMSE MAE MPE MAPE MASE RMSSE ACF1
<chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 ETS Test 922. 1991. 1489. 3.06 5.40 NaN NaN 0.630
2 Holt Test 540. 1952. 1537. 1.66 5.62 NaN NaN 0.604
3 HW Test 500. 1951. 1550. 1.51 5.67 NaN NaN 0.608
4 Damped Test 469. 1959. 1557. 1.39 5.70 NaN NaN 0.613
5 STL Test -11.1 1816. 1565. -0.429 5.83 NaN NaN 0.654
6 exp_dcmp Test -1300. 2381. 2021. -5.25 7.72 NaN NaN 0.692
7 stlf Test -1507. 2550. 2140. -6.01 8.18 NaN NaN 0.707
8 Drift Test -1182. 2648. 2151. -4.90 8.22 NaN NaN 0.521
# Graficar forecast vs test# Gráfico interactivo usando ggplotlyp <- fc |>autoplot(exp_test, level =NULL) +# level = NULL quita intervalos de confianzaautolayer(exp_test, price) +labs(title ="Forecast vs Real", y ="Price")plotly::ggplotly(p)
Se tomó como base el modelo ETS, el cual obtuvo el menor MAE de los modelos propuestos y sobre el se busca añadir elementos al modelo que puedan mejorar el performance del forecast.
Analizando las métricas de performance para los distintos modelos planteados para el forecast de la serie, el modelo con menor MAE fue el ETS, con un valor de 1488.526. El análisis de los residuos del modelo ETS, aplicado sobre la serie transformada con Box-Cox para estabilizar la varianza, muestra un buen ajuste a la serie histórica. La mayoría de los residuos oscilan cerca de cero, dentro de un rango aproximado de ±0.2, lo que indica ausencia de sesgo sistemático, y la autocorrelación no revela patrones significativos pendientes de capturar, sugiriendo que los errores se comportan como ruido blanco. La distribución de los residuos es simétrica y asemeja una distribución normal, con valores extremos limitados a eventos anómalos, siendo el más notable el desplome de 2020 por COVID.
En conjunto, esto evidencia que el modelo ETS (“AAA”) captura el movimiento de la tendencia y la estacionalidad a largo plazo, manejando de manera ‘confiable’ la dinámica histórica de la serie, aunque no puede anticipar shocks extraordinarios. Los errores pequeños y homogéneos fuera de los eventos extremos refuerzan su robustez y precisión en condiciones normales.